package com.yhd.gmall.spring.tx;

import java.io.Serializable;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author yhd
 * @createtime 2020/9/24 21:25
 * spring的事务传播行为
 * 1.required:如果当前没有事务，就创建一个新的事务，如果当前存在事务，就使用当前的事务。
 * 2.supports：如果当前有事务就使用，没有也不创建新的事务。
 * 3.mandatory：支持当前事务，如果当前存在事务，就加入当前事务，如果当前不存在事务，就抛出异常。
 * 4.requires_new:无论当前有没有都创建新的事务。
 * 5.not_supported:有就挂起
 * 6.never：没有事务正常执行，有事务就抛出异常
 * 7.nested：如果当前存在事务，嵌套在事务内执行，否则创建一个新的事务。
 *
 *
 *
 * spring的aop
 *
 * spring的事务时基于aop来实现的，aop面向切面编程。
 * 使用角度讲，将自定义的切面通过切点织入。
 * 源码角度讲，底层实际上使用了反射，在运行时不改变源码的基础上对类或方法进行增强。
 * 动态代理有分为jdk的动态代理，和cglib的动态代理
 *     public static void main(String[] args) {
 *         Proxy.newProxyInstance(
 *                 TxDemo.class.getClassLoader(),
 *                 TxDemo.class.getInterfaces(),
 *                 new InvocationHandler() {
 *                     @Override
 *                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 *                         return null;
 *                     }
 *                 }
 *         )
 *     }
 *  通过反射给我们传递的API来对方法进行增强，我们需要传递被代理类的类加载器，被代理类实现的接口和InvocationHandler的匿名实现类。
 *  在匿名实现类里面通过invoke方法对方法进行增强。
 * spring的角度讲：beanPostProcessor ,beanFactoryPostProcessor, xxxAware,
 * 以beanPostProcessor为例：
 * 里面有两个方法：postProcessorBeforeBeanInitxxxer,postProcessorAfterBeanInitxxxer
 * 这两个方法分别在类的 init方法执行前后执行
 *
 * spring的ioc
 * 反转控制 容器
 *
 */
public class TxDemo implements Serializable {
    private static final long serialVersionUID = -3439779157536340506L;

    public static void main(String[] args) {
        Proxy.newProxyInstance(
                TxDemo.class.getClassLoader(),
                TxDemo.class.getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return null;
                    }
                }
        );
    }

}
